/**
    @brief Module Fichier, fichier source
    @file ufile.cpp
    @version 1.0
    @date 2008/11/01

*/
#include <iostream>
#include <string>
#include "ufile.h"
#include <dirent.h>
#include <sys/types.h>
#include <errno.h>

/**
    @brief Constructeur de Fichier
    @return none
*/
UFile::UFile(void)
{
    path = "";
    owner = NULL;
    good=true;
}

/**
    @brief Constructeur de Fichier
    @param [in] file_path Adresse du fichier
    @return none
*/
UFile::UFile(string file_path)
{
    path = file_path;
    good=true;
}

/**
    @brief Constructeur de Fichier
    @param [in] file_path Adresse du fichier
    @param [in] file_owner Pointeur vers proprietaire
    @return none
*/
UFile::UFile(string file_path, User* file_owner)
{
    path = file_path;
    owner = file_owner;
    struct stat file_status;

    if (stat(path.c_str(), &file_status) == 0)
    {
        if (S_ISDIR(file_status.st_mode))
            type = "directory";
        if (S_ISLNK(file_status.st_mode))
            type = "symbolic_link";
        if (S_ISCHR(file_status.st_mode))
            type = "character_special_char";
        if (S_ISBLK(file_status.st_mode))
            type = "block_special_char";
        if (S_ISFIFO(file_status.st_mode))
            type = "fifo";
//        if (S_ISSOCK(file_status.st_mode))
//           type = "socket";
        if (S_ISREG(file_status.st_mode))
            type = "normal";

        good=true;
    }
    else   /* stat() call failed and returned '-1'. */
    {
        perror("stat");
        good=false;
    }
    //getname
    name = path.substr((path.find_last_of("/")+1));
    //fin getname
}

/**
    @brief Destructeur de Fichier
    @return none
*/
UFile::~UFile(void)
{
}

/**
    @brief Surcharge opérateur égale
    @return bool= True si égale
*/
bool UFile::operator==(const UFile & uf) const
{
    return (name == uf._name());
}

/**
    @brief Accesseur nom du fichier
    @return string: nom du fichier
*/
string UFile::_name(void) const
{
    return name;
}

/**
    @brief Accesseur adresse du fichier
    @return string: adresse du fichier
*/
string UFile::_path(void) const
{
    return path;
}

/**
    @brief Accesseur Propriétaire du Fichier
    @return User: Propriétaire du fichier
*/
User UFile::_owner(void) const
{
    return *owner;
}

/**
    @brief Accesseur type du fichier
    @return string: type du fichier
*/
string UFile::_type(void) const
{
    return type;
}

/**
    @brief Accesseur nom du dossier père
    @return string: nom du dossier père
*/
string UFile::_d_name(void) const
{

    return name;
}

/**
    @brief Mutateur propriétaire
    @return none
*/
void UFile::setOwner(User* file_owner)
{
    owner = file_owner;
}

/**
    @brief Mutateur Adresse
    @return none
*/
void UFile::setPath(string file_path)
{
    path = file_path;
}

/**
    @brief Mutateur Nom du fichier
    @return none
*/
void UFile::setName(string fname)
{
    name = fname;
}

/**
    @brief Mutateur Type du fichier
    @return none
*/
void UFile::setType(string ftype)
{
    type = ftype;
}

/**
    @brief Accesseur validité du noeud
    @return bool
*/
bool UFile::isGood(void)
{
    return good;
}
/**
    @brief Test si le fichier est un lien symbolique
    @return bool
*/
bool UFile::isSLink(void)
{
    return type=="symbolic_link";
}

/**
    @brief Test si le fichier est un dossier
    @return bool
*/
bool UFile::isDir(void)
{
    return type=="directory";
}

/**
    @brief Test si le noeud existe
    @return bool
*/
bool UFile::nodeExists(void)
{
    struct stat file_status;
    if (stat(path.c_str(), &file_status) == 0)
    {
        return true;
    }
    else
    {
        return false;
    }

}
